library(readr)
FIFADATABASE <- read_csv2("ultimateData.csv")
Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
Parsed with column specification:
cols(
  .default = col_double(),
  short_name = col_character(),
  dob = col_number(),
  nationality = col_character(),
  club_name = col_character(),
  league_name = col_character(),
  team_position = col_character(),
  joined = col_number()
)
See spec(...) for full column specifications.
data(FIFADATABASE)
data set 㤼㸱FIFADATABASE㤼㸲 not found
remove.zero = apply(FIFADATABASE, 1, function(row) all(row !=0 ))
FIFADATABASE[remove.zero,]
na.omit(FIFADATABASE)
#Magassággal kapcsolatos tények

cat("A legmagasabb játékos:",max(FIFADATABASE$height_cm),"cm\n")
A legmagasabb játékos: 206 cm
cat("A legalacsonyabb játékos:",min(FIFADATABASE$height_cm),"cm\n")
A legalacsonyabb játékos: 155 cm
heightHist <-hist(FIFADATABASE$height_cm,main = paste("Histogram of heights"),xlab = "Heights (cm)")

imax <- which.max(heightHist$counts)
cat("A legtöbb játékos (", heightHist$counts[imax] ," db) a ",heightHist$breaks[imax],"-",heightHist$breaks[imax+1]," cm tartományba esik", sep="")
A legtöbb játékos (4817 db) a 175-180 cm tartományba esik
FIFADATABASE.filtered<-FIFADATABASE[which(FIFADATABASE$wage_eur>10000
& FIFADATABASE$wage_eur< 200000),] 

height_cm.wage<-aggregate(FIFADATABASE.filtered$wage_eur, by=list(Height = FIFADATABASE.filtered$height_cm), FUN = mean )

colnames(height_cm.wage) <- c("Height", "Mean of Wage")

barplot(height_cm.wage$`Mean of Wage`,names = height_cm.wage$Height,width = 3,las=2,
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        xlab = "Height(cm)",
        main="Average salary by player's height")

#Top 10 legmagasabb nemzet a FIFA-ban játszó játékosaik alapján

height_cm.nation<-aggregate(FIFADATABASE$height_cm, by=list(Nationality = FIFADATABASE$nationality), FUN = mean )
height_cm.nation <- height_cm.nation[order(height_cm.nation[,2],decreasing = TRUE ),]
height_cm.nation <- height_cm.nation[1:10,]

colnames(height_cm.nation) <- c("Nation", "Mean of height")
height_cm.nation
ylim <- c(0, 1.1*max(height_cm.nation$`Mean of height`))

plot.height<-barplot(height_cm.nation$`Mean of height`,names = height_cm.nation$Nation,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Height(cm)",
        main="Average heights by nations")
rounded.average.height<-round(height_cm.nation$`Mean of height`,digits = 1)

text(x = plot.height, y = height_cm.nation$`Mean of height` ,label = rounded.average.height, pos = 3, cex = 0.8, col = "red")
text(x = plot.height, y = height_cm.nation$`Mean of height` ,label = height_cm.nation$Nation,srt=90, pos = 2, cex = 1, col = "black",adj=2)


#Top 10 legalacsonyabb nemzet a FIFA-ban játszó játékosaik alapján


height_cm.nation<-aggregate(FIFADATABASE$height_cm, by=list(Nationality = FIFADATABASE$nationality), FUN = mean )
height_cm.nation <- height_cm.nation[order(height_cm.nation[,2],decreasing = FALSE ),]
height_cm.nation <- height_cm.nation[1:10,]

colnames(height_cm.nation) <- c("Nation", "Mean of height")
height_cm.nation
ylim <- c(0, 1.1*max(height_cm.nation$`Mean of height`))

plot.height<-barplot(height_cm.nation$`Mean of height`,names = height_cm.nation$Nation,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Height(cm)",
        main="Average heights by nations")
rounded.average.height<-round(height_cm.nation$`Mean of height`,digits = 1)

text(x = plot.height, y = height_cm.nation$`Mean of height` ,label = rounded.average.height, pos = 3, cex = 0.8, col = "red")
text(x = plot.height, y = height_cm.nation$`Mean of height` ,label = height_cm.nation$Nation,srt=90, pos = 2, cex = 1, col = "black",adj=2)

NA
NA
NA
#A clubok melyekben átlagosan a legalacsonyabb játékosok játszanak
height.club<-aggregate(FIFADATABASE$height_cm, by=list(Clubs = FIFADATABASE$club_name), FUN = mean )
height.club <- height.club[order(height.club[,2],decreasing = FALSE ),]
height.club <- height.club[1:10,]

colnames(height.club) <- c("Club", "Mean of height")

height.club
ylim <- c(0, 1.1*max(height.club$`Mean of height`))

plot.height<-barplot(height.club$`Mean of height`,names = height.club$Club,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Height (cm)",
        main="Average heights by clubs")
rounded.average.height<-round(height.club$`Mean of height`,digits = 2)

text(x = plot.height, y = height.club$`Mean of height` ,label = rounded.average.height, pos = 3, cex = 0.8, col = "blue")
text(x = plot.height, y = height.club$`Mean of height` ,label = height.club$Club,srt=90, pos = 2, cex = 1, col = "black",adj=2)


#A clubok melyekben átlagosan a legmagasabb játékosok játszanak
height.club<-aggregate(FIFADATABASE$height_cm, by=list(Clubs = FIFADATABASE$club_name), FUN = mean )
height.club <- height.club[order(height.club[,2],decreasing = TRUE ),]
height.club <- height.club[1:10,]

colnames(height.club) <- c("Club", "Mean of height")

height.club
ylim <- c(0, 1.1*max(height.club$`Mean of height`))

plot.height<-barplot(height.club$`Mean of height`,names = height.club$Club,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Height (cm)",
        main="Average heights by clubs")
rounded.average.height<-round(height.club$`Mean of height`,digits = 2)

text(x = plot.height, y = height.club$`Mean of height` ,label = rounded.average.height, pos = 3, cex = 0.8, col = "blue")
text(x = plot.height, y = height.club$`Mean of height` ,label = height.club$Club,srt=90, pos = 2, cex = 1, col = "black",adj=2)

NA
NA
NA
#Korral kapcsolatos tények

cat("A legidősebb játékos:",max(FIFADATABASE$age),"éves\n")
A legidősebb játékos: 53 éves
cat("A legafiatalabb játékos:",min(FIFADATABASE$age),"éves\n")
A legafiatalabb játékos: 16 éves
agehist<-hist(FIFADATABASE$age,main = paste("Histogram of ages"),xlab = "Ages (year)",xlim = c(15,45))
axis(side = 1,at=seq(10,45,by=5))


cat("A legtöbb játékos (", agehist$counts[imax] ," db) a ",agehist$breaks[imax],"-",agehist$breaks[imax+1]," év tartományba esik", sep="")
A legtöbb játékos (2527 db) a 24-26 év tartományba esik
imax <- which.max(agehist$counts)

wageByAge<-aggregate(FIFADATABASE.filtered$wage_eur, by=list(Age = FIFADATABASE.filtered$age), FUN = mean )

colnames(wageByAge) <- c("Age", "Mean of Wage")

barplot(wageByAge$`Mean of Wage`,names = wageByAge$Age ,width = 3,las=1,
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        xlab = "Age (year)",
        main="Average salary by player's age")

NA
NA
#Top 10 legfiatalabb nemzet a FIFA-ban játszó játékosaik alapján
age.nation<-aggregate(FIFADATABASE$age, by=list(Nationality = FIFADATABASE$nationality), FUN = mean )
age.nation <- age.nation[order(age.nation[,2],decreasing = FALSE ),]
age.nation <- age.nation[1:10,]

colnames(age.nation) <- c("Nation", "Mean of age")

age.nation
ylim <- c(0, 1.1*max(age.nation$`Mean of age`))

plot.age<-barplot(age.nation$`Mean of age`,names = age.nation$Nation,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Age (year)",
        main="Average age by nations")
rounded.average.heights<-round(age.nation$`Mean of age`,digits = 2)

text(x = plot.age, y = age.nation$`Mean of age` ,label = rounded.average.heights, pos = 3, cex = 0.8, col = "red")
text(x = plot.age, y = age.nation$`Mean of age` ,label = age.nation$Nation,srt=90, pos = 2, cex = 1, col = "black",adj=2)

#Top 10 legidősebbb nemzet a FIFA-ban játszó játékosaik alapján
age.nation<-aggregate(FIFADATABASE$age, by=list(Nationality = FIFADATABASE$nationality), FUN = mean )
age.nation <- age.nation[order(age.nation[,2],decreasing = TRUE ),]
age.nation <- age.nation[1:10,]

colnames(age.nation) <- c("Nation", "Mean of age")

palette("default")

age.nation
ylim <- c(0, 1.1*max(age.nation$`Mean of age`))

plot.age<-barplot(age.nation$`Mean of age`,names = age.nation$Nation,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Age (year)",
        main="Average age by nations")
rounded.average.heights<-round(age.nation$`Mean of age`,digits = 2)

text(x = plot.age, y = age.nation$`Mean of age` ,label = rounded.average.heights, pos = 3, cex = 0.8, col = "red")
text(x = plot.age, y = age.nation$`Mean of age` ,label = age.nation$Nation,srt=90, pos = 2, cex = 1, col = "black",adj=2)

NA
NA
NA
#A clubok melyekben átlagosan a legfiatalabb játékosok játszanak
age.club<-aggregate(FIFADATABASE$age, by=list(Clubs = FIFADATABASE$club_name), FUN = mean )
age.club <- age.club[order(age.club[,2],decreasing = FALSE ),]
age.club <- age.club[1:10,]

colnames(age.club) <- c("Club", "Mean of age")

age.club
ylim <- c(0, 1.1*max(age.club$`Mean of age`))

plot.age<-barplot(age.club$`Mean of age`,names = age.club$Club,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Age (year)",
        main="Average age by clubs")
rounded.average.heights<-round(age.club$`Mean of age`,digits = 2)

text(x = plot.age, y = age.club$`Mean of age` ,label = rounded.average.heights, pos = 3, cex = 0.8, col = "blue")
text(x = plot.age, y = age.club$`Mean of age` ,label = age.club$Club,srt=90, pos = 2, cex = 1, col = "black",adj=2)


#A clubok melyekben átlagosan a legidősebb játékosok játszanak
age.club<-aggregate(FIFADATABASE$age, by=list(Clubs = FIFADATABASE$club_name), FUN = mean )
age.club <- age.club[order(age.club[,2],decreasing = TRUE ),]
age.club <- age.club[1:10,]

colnames(age.club) <- c("Club", "Mean of age")

age.club
ylim <- c(0, 1.1*max(age.club$`Mean of age`))

plot.age<-barplot(age.club$`Mean of age`,names = age.club$Club,width = 3,ylim = ylim,xaxt="n",
        col = NULL,
        horiz = FALSE,
        cex.names = 0.6,
        ylab = "Age (year)",
        main="Average age by clubs")
rounded.average.heights<-round(age.club$`Mean of age`,digits = 2)

text(x = plot.age, y = age.club$`Mean of age` ,label = rounded.average.heights, pos = 3, cex = 0.8, col = "blue")
text(x = plot.age, y = age.club$`Mean of age` ,label = age.club$Club,srt=90, pos = 2, cex = 1, col = "black",adj=0.5)

NA
NA
#a top 10 legtöbb játékost a FIFA-ba delegáló ország

different_nations <-unique(FIFADATABASE$nationality)

playersCounted <-table(FIFADATABASE$nationality)
numberOfPlayersByNations <-data.frame(playersCounted)
numberOfPlayersByNations <- numberOfPlayersByNations[order(numberOfPlayersByNations[,2],decreasing = TRUE ),]
numberOfPlayersByNations <- numberOfPlayersByNations[1:10,]

colnames(numberOfPlayersByNations) <- c("Nation", "Number of players")

numberOfPlayersByNations
nations<- unique(numberOfPlayersByNations$Nation)
numbers<-c(numberOfPlayersByNations$`Number of players`)

library(plotly)
package 㤼㸱plotly㤼㸲 was built under R version 4.0.4Loading required package: ggplot2
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.4
Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
pie <- plot_ly(numberOfPlayersByNations, labels = nations, values = numbers, type = 'pie',text=numbers)
pie

NA
#top 20 legjobb átlagfizetésű klub

wage.average.by.clubs<- aggregate(FIFADATABASE.filtered$wage_eur, by=list(Club = FIFADATABASE.filtered$club_name), FUN = mean )
wage.average.by.clubs <- wage.average.by.clubs[order(wage.average.by.clubs[,2],decreasing = TRUE),]

colnames(wage.average.by.clubs) <- c("Club", "Mean of wage by clubs")

ylim <- c(0, 1.2*max(wage.average.by.clubs$`Mean of wage by clubs`))
wage.average.by.clubs <- wage.average.by.clubs[1:20,]

rounded.average.wage<-round(wage.average.by.clubs$`Mean of wage by clubs`,digits = 0)

plot.wage<-barplot(wage.average.by.clubs$`Mean of wage by clubs`,names = wage.average.by.clubs$Club,ylim =ylim,las=2,
        col = 1:30,
        horiz = FALSE,
        cex.names = .6,
        main="Mean of wage by Clubs")

text(x = plot.wage, y = wage.average.by.clubs$`Mean of wage by clubs` ,label = rounded.average.wage, pos = 4, cex = 0.7, 
     col = "black",srt=45)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCkZJRkFEQVRBQkFTRSA8LSByZWFkX2NzdjIoInVsdGltYXRlRGF0YS5jc3YiKQ0KZGF0YShGSUZBREFUQUJBU0UpDQpyZW1vdmUuemVybyA9IGFwcGx5KEZJRkFEQVRBQkFTRSwgMSwgZnVuY3Rpb24ocm93KSBhbGwocm93ICE9MCApKQ0KRklGQURBVEFCQVNFW3JlbW92ZS56ZXJvLF0NCm5hLm9taXQoRklGQURBVEFCQVNFKQ0KYGBgDQoNCmBgYHtyfQ0KI01hZ2Fzc8OhZ2dhbCBrYXBjc29sYXRvcyB0w6lueWVrDQoNCmNhdCgiQSBsZWdtYWdhc2FiYiBqw6F0w6lrb3M6IixtYXgoRklGQURBVEFCQVNFJGhlaWdodF9jbSksImNtXG4iKQ0KY2F0KCJBIGxlZ2FsYWNzb255YWJiIGrDoXTDqWtvczoiLG1pbihGSUZBREFUQUJBU0UkaGVpZ2h0X2NtKSwiY21cbiIpDQoNCmhlaWdodEhpc3QgPC1oaXN0KEZJRkFEQVRBQkFTRSRoZWlnaHRfY20sbWFpbiA9IHBhc3RlKCJIaXN0b2dyYW0gb2YgaGVpZ2h0cyIpLHhsYWIgPSAiSGVpZ2h0cyAoY20pIikNCmltYXggPC0gd2hpY2gubWF4KGhlaWdodEhpc3QkY291bnRzKQ0KY2F0KCJBIGxlZ3TDtmJiIGrDoXTDqWtvcyAoIiwgaGVpZ2h0SGlzdCRjb3VudHNbaW1heF0gLCIgZGIpIGEgIixoZWlnaHRIaXN0JGJyZWFrc1tpbWF4XSwiLSIsaGVpZ2h0SGlzdCRicmVha3NbaW1heCsxXSwiIGNtIHRhcnRvbcOhbnliYSBlc2lrIiwgc2VwPSIiKQ0KDQpGSUZBREFUQUJBU0UuZmlsdGVyZWQ8LUZJRkFEQVRBQkFTRVt3aGljaChGSUZBREFUQUJBU0Ukd2FnZV9ldXI+MTAwMDANCiYgRklGQURBVEFCQVNFJHdhZ2VfZXVyPCAyMDAwMDApLF0gDQoNCmhlaWdodF9jbS53YWdlPC1hZ2dyZWdhdGUoRklGQURBVEFCQVNFLmZpbHRlcmVkJHdhZ2VfZXVyLCBieT1saXN0KEhlaWdodCA9IEZJRkFEQVRBQkFTRS5maWx0ZXJlZCRoZWlnaHRfY20pLCBGVU4gPSBtZWFuICkNCg0KY29sbmFtZXMoaGVpZ2h0X2NtLndhZ2UpIDwtIGMoIkhlaWdodCIsICJNZWFuIG9mIFdhZ2UiKQ0KDQpiYXJwbG90KGhlaWdodF9jbS53YWdlJGBNZWFuIG9mIFdhZ2VgLG5hbWVzID0gaGVpZ2h0X2NtLndhZ2UkSGVpZ2h0LHdpZHRoID0gMyxsYXM9MiwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB4bGFiID0gIkhlaWdodChjbSkiLA0KICAgICAgICBtYWluPSJBdmVyYWdlIHNhbGFyeSBieSBwbGF5ZXIncyBoZWlnaHQiKQ0KDQpgYGANCmBgYHtyfQ0KI1RvcCAxMCBsZWdtYWdhc2FiYiBuZW16ZXQgYSBGSUZBLWJhbiBqw6F0c3rDsyBqw6F0w6lrb3NhaWsgYWxhcGrDoW4NCg0KaGVpZ2h0X2NtLm5hdGlvbjwtYWdncmVnYXRlKEZJRkFEQVRBQkFTRSRoZWlnaHRfY20sIGJ5PWxpc3QoTmF0aW9uYWxpdHkgPSBGSUZBREFUQUJBU0UkbmF0aW9uYWxpdHkpLCBGVU4gPSBtZWFuICkNCmhlaWdodF9jbS5uYXRpb24gPC0gaGVpZ2h0X2NtLm5hdGlvbltvcmRlcihoZWlnaHRfY20ubmF0aW9uWywyXSxkZWNyZWFzaW5nID0gVFJVRSApLF0NCmhlaWdodF9jbS5uYXRpb24gPC0gaGVpZ2h0X2NtLm5hdGlvblsxOjEwLF0NCg0KY29sbmFtZXMoaGVpZ2h0X2NtLm5hdGlvbikgPC0gYygiTmF0aW9uIiwgIk1lYW4gb2YgaGVpZ2h0IikNCmhlaWdodF9jbS5uYXRpb24NCnlsaW0gPC0gYygwLCAxLjEqbWF4KGhlaWdodF9jbS5uYXRpb24kYE1lYW4gb2YgaGVpZ2h0YCkpDQoNCnBsb3QuaGVpZ2h0PC1iYXJwbG90KGhlaWdodF9jbS5uYXRpb24kYE1lYW4gb2YgaGVpZ2h0YCxuYW1lcyA9IGhlaWdodF9jbS5uYXRpb24kTmF0aW9uLHdpZHRoID0gMyx5bGltID0geWxpbSx4YXh0PSJuIiwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB5bGFiID0gIkhlaWdodChjbSkiLA0KICAgICAgICBtYWluPSJBdmVyYWdlIGhlaWdodHMgYnkgbmF0aW9ucyIpDQpyb3VuZGVkLmF2ZXJhZ2UuaGVpZ2h0PC1yb3VuZChoZWlnaHRfY20ubmF0aW9uJGBNZWFuIG9mIGhlaWdodGAsZGlnaXRzID0gMSkNCg0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHRfY20ubmF0aW9uJGBNZWFuIG9mIGhlaWdodGAgLGxhYmVsID0gcm91bmRlZC5hdmVyYWdlLmhlaWdodCwgcG9zID0gMywgY2V4ID0gMC44LCBjb2wgPSAicmVkIikNCnRleHQoeCA9IHBsb3QuaGVpZ2h0LCB5ID0gaGVpZ2h0X2NtLm5hdGlvbiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IGhlaWdodF9jbS5uYXRpb24kTmF0aW9uLHNydD05MCwgcG9zID0gMiwgY2V4ID0gMSwgY29sID0gImJsYWNrIixhZGo9MikNCg0KI1RvcCAxMCBsZWdhbGFjc29ueWFiYiBuZW16ZXQgYSBGSUZBLWJhbiBqw6F0c3rDsyBqw6F0w6lrb3NhaWsgYWxhcGrDoW4NCg0KDQpoZWlnaHRfY20ubmF0aW9uPC1hZ2dyZWdhdGUoRklGQURBVEFCQVNFJGhlaWdodF9jbSwgYnk9bGlzdChOYXRpb25hbGl0eSA9IEZJRkFEQVRBQkFTRSRuYXRpb25hbGl0eSksIEZVTiA9IG1lYW4gKQ0KaGVpZ2h0X2NtLm5hdGlvbiA8LSBoZWlnaHRfY20ubmF0aW9uW29yZGVyKGhlaWdodF9jbS5uYXRpb25bLDJdLGRlY3JlYXNpbmcgPSBGQUxTRSApLF0NCmhlaWdodF9jbS5uYXRpb24gPC0gaGVpZ2h0X2NtLm5hdGlvblsxOjEwLF0NCg0KY29sbmFtZXMoaGVpZ2h0X2NtLm5hdGlvbikgPC0gYygiTmF0aW9uIiwgIk1lYW4gb2YgaGVpZ2h0IikNCmhlaWdodF9jbS5uYXRpb24NCnlsaW0gPC0gYygwLCAxLjEqbWF4KGhlaWdodF9jbS5uYXRpb24kYE1lYW4gb2YgaGVpZ2h0YCkpDQoNCnBsb3QuaGVpZ2h0PC1iYXJwbG90KGhlaWdodF9jbS5uYXRpb24kYE1lYW4gb2YgaGVpZ2h0YCxuYW1lcyA9IGhlaWdodF9jbS5uYXRpb24kTmF0aW9uLHdpZHRoID0gMyx5bGltID0geWxpbSx4YXh0PSJuIiwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB5bGFiID0gIkhlaWdodChjbSkiLA0KICAgICAgICBtYWluPSJBdmVyYWdlIGhlaWdodHMgYnkgbmF0aW9ucyIpDQpyb3VuZGVkLmF2ZXJhZ2UuaGVpZ2h0PC1yb3VuZChoZWlnaHRfY20ubmF0aW9uJGBNZWFuIG9mIGhlaWdodGAsZGlnaXRzID0gMSkNCg0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHRfY20ubmF0aW9uJGBNZWFuIG9mIGhlaWdodGAgLGxhYmVsID0gcm91bmRlZC5hdmVyYWdlLmhlaWdodCwgcG9zID0gMywgY2V4ID0gMC44LCBjb2wgPSAicmVkIikNCnRleHQoeCA9IHBsb3QuaGVpZ2h0LCB5ID0gaGVpZ2h0X2NtLm5hdGlvbiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IGhlaWdodF9jbS5uYXRpb24kTmF0aW9uLHNydD05MCwgcG9zID0gMiwgY2V4ID0gMSwgY29sID0gImJsYWNrIixhZGo9MikNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCiNBIGNsdWJvayBtZWx5ZWtiZW4gw6F0bGFnb3NhbiBhIGxlZ2FsYWNzb255YWJiIGrDoXTDqWtvc29rIGrDoXRzemFuYWsNCmhlaWdodC5jbHViPC1hZ2dyZWdhdGUoRklGQURBVEFCQVNFJGhlaWdodF9jbSwgYnk9bGlzdChDbHVicyA9IEZJRkFEQVRBQkFTRSRjbHViX25hbWUpLCBGVU4gPSBtZWFuICkNCmhlaWdodC5jbHViIDwtIGhlaWdodC5jbHViW29yZGVyKGhlaWdodC5jbHViWywyXSxkZWNyZWFzaW5nID0gRkFMU0UgKSxdDQpoZWlnaHQuY2x1YiA8LSBoZWlnaHQuY2x1YlsxOjEwLF0NCg0KY29sbmFtZXMoaGVpZ2h0LmNsdWIpIDwtIGMoIkNsdWIiLCAiTWVhbiBvZiBoZWlnaHQiKQ0KDQpoZWlnaHQuY2x1Yg0KeWxpbSA8LSBjKDAsIDEuMSptYXgoaGVpZ2h0LmNsdWIkYE1lYW4gb2YgaGVpZ2h0YCkpDQoNCnBsb3QuaGVpZ2h0PC1iYXJwbG90KGhlaWdodC5jbHViJGBNZWFuIG9mIGhlaWdodGAsbmFtZXMgPSBoZWlnaHQuY2x1YiRDbHViLHdpZHRoID0gMyx5bGltID0geWxpbSx4YXh0PSJuIiwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB5bGFiID0gIkhlaWdodCAoY20pIiwNCiAgICAgICAgbWFpbj0iQXZlcmFnZSBoZWlnaHRzIGJ5IGNsdWJzIikNCnJvdW5kZWQuYXZlcmFnZS5oZWlnaHQ8LXJvdW5kKGhlaWdodC5jbHViJGBNZWFuIG9mIGhlaWdodGAsZGlnaXRzID0gMikNCg0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHQuY2x1YiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IHJvdW5kZWQuYXZlcmFnZS5oZWlnaHQsIHBvcyA9IDMsIGNleCA9IDAuOCwgY29sID0gImJsdWUiKQ0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHQuY2x1YiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IGhlaWdodC5jbHViJENsdWIsc3J0PTkwLCBwb3MgPSAyLCBjZXggPSAxLCBjb2wgPSAiYmxhY2siLGFkaj0yKQ0KDQojQSBjbHVib2sgbWVseWVrYmVuIMOhdGxhZ29zYW4gYSBsZWdtYWdhc2FiYiBqw6F0w6lrb3NvayBqw6F0c3phbmFrDQpoZWlnaHQuY2x1YjwtYWdncmVnYXRlKEZJRkFEQVRBQkFTRSRoZWlnaHRfY20sIGJ5PWxpc3QoQ2x1YnMgPSBGSUZBREFUQUJBU0UkY2x1Yl9uYW1lKSwgRlVOID0gbWVhbiApDQpoZWlnaHQuY2x1YiA8LSBoZWlnaHQuY2x1YltvcmRlcihoZWlnaHQuY2x1YlssMl0sZGVjcmVhc2luZyA9IFRSVUUgKSxdDQpoZWlnaHQuY2x1YiA8LSBoZWlnaHQuY2x1YlsxOjEwLF0NCg0KY29sbmFtZXMoaGVpZ2h0LmNsdWIpIDwtIGMoIkNsdWIiLCAiTWVhbiBvZiBoZWlnaHQiKQ0KDQpoZWlnaHQuY2x1Yg0KeWxpbSA8LSBjKDAsIDEuMSptYXgoaGVpZ2h0LmNsdWIkYE1lYW4gb2YgaGVpZ2h0YCkpDQoNCnBsb3QuaGVpZ2h0PC1iYXJwbG90KGhlaWdodC5jbHViJGBNZWFuIG9mIGhlaWdodGAsbmFtZXMgPSBoZWlnaHQuY2x1YiRDbHViLHdpZHRoID0gMyx5bGltID0geWxpbSx4YXh0PSJuIiwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB5bGFiID0gIkhlaWdodCAoY20pIiwNCiAgICAgICAgbWFpbj0iQXZlcmFnZSBoZWlnaHRzIGJ5IGNsdWJzIikNCnJvdW5kZWQuYXZlcmFnZS5oZWlnaHQ8LXJvdW5kKGhlaWdodC5jbHViJGBNZWFuIG9mIGhlaWdodGAsZGlnaXRzID0gMikNCg0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHQuY2x1YiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IHJvdW5kZWQuYXZlcmFnZS5oZWlnaHQsIHBvcyA9IDMsIGNleCA9IDAuOCwgY29sID0gImJsdWUiKQ0KdGV4dCh4ID0gcGxvdC5oZWlnaHQsIHkgPSBoZWlnaHQuY2x1YiRgTWVhbiBvZiBoZWlnaHRgICxsYWJlbCA9IGhlaWdodC5jbHViJENsdWIsc3J0PTkwLCBwb3MgPSAyLCBjZXggPSAxLCBjb2wgPSAiYmxhY2siLGFkaj0yKQ0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI0tvcnJhbCBrYXBjc29sYXRvcyB0w6lueWVrDQoNCmNhdCgiQSBsZWdpZMWRc2ViYiBqw6F0w6lrb3M6IixtYXgoRklGQURBVEFCQVNFJGFnZSksIsOpdmVzXG4iKQ0KY2F0KCJBIGxlZ2FmaWF0YWxhYmIgasOhdMOpa29zOiIsbWluKEZJRkFEQVRBQkFTRSRhZ2UpLCLDqXZlc1xuIikNCmFnZWhpc3Q8LWhpc3QoRklGQURBVEFCQVNFJGFnZSxtYWluID0gcGFzdGUoIkhpc3RvZ3JhbSBvZiBhZ2VzIikseGxhYiA9ICJBZ2VzICh5ZWFyKSIseGxpbSA9IGMoMTUsNDUpKQ0KYXhpcyhzaWRlID0gMSxhdD1zZXEoMTAsNDUsYnk9NSkpDQoNCmNhdCgiQSBsZWd0w7ZiYiBqw6F0w6lrb3MgKCIsIGFnZWhpc3QkY291bnRzW2ltYXhdICwiIGRiKSBhICIsYWdlaGlzdCRicmVha3NbaW1heF0sIi0iLGFnZWhpc3QkYnJlYWtzW2ltYXgrMV0sIiDDqXYgdGFydG9tw6FueWJhIGVzaWsiLCBzZXA9IiIpDQoNCmltYXggPC0gd2hpY2gubWF4KGFnZWhpc3QkY291bnRzKQ0KDQp3YWdlQnlBZ2U8LWFnZ3JlZ2F0ZShGSUZBREFUQUJBU0UuZmlsdGVyZWQkd2FnZV9ldXIsIGJ5PWxpc3QoQWdlID0gRklGQURBVEFCQVNFLmZpbHRlcmVkJGFnZSksIEZVTiA9IG1lYW4gKQ0KDQpjb2xuYW1lcyh3YWdlQnlBZ2UpIDwtIGMoIkFnZSIsICJNZWFuIG9mIFdhZ2UiKQ0KDQpiYXJwbG90KHdhZ2VCeUFnZSRgTWVhbiBvZiBXYWdlYCxuYW1lcyA9IHdhZ2VCeUFnZSRBZ2UgLHdpZHRoID0gMyxsYXM9MSwNCiAgICAgICAgY29sID0gTlVMTCwNCiAgICAgICAgaG9yaXogPSBGQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzID0gMC42LA0KICAgICAgICB4bGFiID0gIkFnZSAoeWVhcikiLA0KICAgICAgICBtYWluPSJBdmVyYWdlIHNhbGFyeSBieSBwbGF5ZXIncyBhZ2UiKQ0KDQoNCmBgYA0KYGBge3J9DQojVG9wIDEwIGxlZ2ZpYXRhbGFiYiBuZW16ZXQgYSBGSUZBLWJhbiBqw6F0c3rDsyBqw6F0w6lrb3NhaWsgYWxhcGrDoW4NCmFnZS5uYXRpb248LWFnZ3JlZ2F0ZShGSUZBREFUQUJBU0UkYWdlLCBieT1saXN0KE5hdGlvbmFsaXR5ID0gRklGQURBVEFCQVNFJG5hdGlvbmFsaXR5KSwgRlVOID0gbWVhbiApDQphZ2UubmF0aW9uIDwtIGFnZS5uYXRpb25bb3JkZXIoYWdlLm5hdGlvblssMl0sZGVjcmVhc2luZyA9IEZBTFNFICksXQ0KYWdlLm5hdGlvbiA8LSBhZ2UubmF0aW9uWzE6MTAsXQ0KDQpjb2xuYW1lcyhhZ2UubmF0aW9uKSA8LSBjKCJOYXRpb24iLCAiTWVhbiBvZiBhZ2UiKQ0KDQphZ2UubmF0aW9uDQp5bGltIDwtIGMoMCwgMS4xKm1heChhZ2UubmF0aW9uJGBNZWFuIG9mIGFnZWApKQ0KDQpwbG90LmFnZTwtYmFycGxvdChhZ2UubmF0aW9uJGBNZWFuIG9mIGFnZWAsbmFtZXMgPSBhZ2UubmF0aW9uJE5hdGlvbix3aWR0aCA9IDMseWxpbSA9IHlsaW0seGF4dD0ibiIsDQogICAgICAgIGNvbCA9IE5VTEwsDQogICAgICAgIGhvcml6ID0gRkFMU0UsDQogICAgICAgIGNleC5uYW1lcyA9IDAuNiwNCiAgICAgICAgeWxhYiA9ICJBZ2UgKHllYXIpIiwNCiAgICAgICAgbWFpbj0iQXZlcmFnZSBhZ2UgYnkgbmF0aW9ucyIpDQpyb3VuZGVkLmF2ZXJhZ2UuaGVpZ2h0czwtcm91bmQoYWdlLm5hdGlvbiRgTWVhbiBvZiBhZ2VgLGRpZ2l0cyA9IDIpDQoNCnRleHQoeCA9IHBsb3QuYWdlLCB5ID0gYWdlLm5hdGlvbiRgTWVhbiBvZiBhZ2VgICxsYWJlbCA9IHJvdW5kZWQuYXZlcmFnZS5oZWlnaHRzLCBwb3MgPSAzLCBjZXggPSAwLjgsIGNvbCA9ICJyZWQiKQ0KdGV4dCh4ID0gcGxvdC5hZ2UsIHkgPSBhZ2UubmF0aW9uJGBNZWFuIG9mIGFnZWAgLGxhYmVsID0gYWdlLm5hdGlvbiROYXRpb24sc3J0PTkwLCBwb3MgPSAyLCBjZXggPSAxLCBjb2wgPSAiYmxhY2siLGFkaj0yKQ0KDQojVG9wIDEwIGxlZ2lkxZFzZWJiYiBuZW16ZXQgYSBGSUZBLWJhbiBqw6F0c3rDsyBqw6F0w6lrb3NhaWsgYWxhcGrDoW4NCmFnZS5uYXRpb248LWFnZ3JlZ2F0ZShGSUZBREFUQUJBU0UkYWdlLCBieT1saXN0KE5hdGlvbmFsaXR5ID0gRklGQURBVEFCQVNFJG5hdGlvbmFsaXR5KSwgRlVOID0gbWVhbiApDQphZ2UubmF0aW9uIDwtIGFnZS5uYXRpb25bb3JkZXIoYWdlLm5hdGlvblssMl0sZGVjcmVhc2luZyA9IFRSVUUgKSxdDQphZ2UubmF0aW9uIDwtIGFnZS5uYXRpb25bMToxMCxdDQoNCmNvbG5hbWVzKGFnZS5uYXRpb24pIDwtIGMoIk5hdGlvbiIsICJNZWFuIG9mIGFnZSIpDQoNCnBhbGV0dGUoImRlZmF1bHQiKQ0KYWdlLm5hdGlvbg0KeWxpbSA8LSBjKDAsIDEuMSptYXgoYWdlLm5hdGlvbiRgTWVhbiBvZiBhZ2VgKSkNCg0KcGxvdC5hZ2U8LWJhcnBsb3QoYWdlLm5hdGlvbiRgTWVhbiBvZiBhZ2VgLG5hbWVzID0gYWdlLm5hdGlvbiROYXRpb24sd2lkdGggPSAzLHlsaW0gPSB5bGltLHhheHQ9Im4iLA0KICAgICAgICBjb2wgPSBOVUxMLA0KICAgICAgICBob3JpeiA9IEZBTFNFLA0KICAgICAgICBjZXgubmFtZXMgPSAwLjYsDQogICAgICAgIHlsYWIgPSAiQWdlICh5ZWFyKSIsDQogICAgICAgIG1haW49IkF2ZXJhZ2UgYWdlIGJ5IG5hdGlvbnMiKQ0Kcm91bmRlZC5hdmVyYWdlLmhlaWdodHM8LXJvdW5kKGFnZS5uYXRpb24kYE1lYW4gb2YgYWdlYCxkaWdpdHMgPSAyKQ0KDQp0ZXh0KHggPSBwbG90LmFnZSwgeSA9IGFnZS5uYXRpb24kYE1lYW4gb2YgYWdlYCAsbGFiZWwgPSByb3VuZGVkLmF2ZXJhZ2UuaGVpZ2h0cywgcG9zID0gMywgY2V4ID0gMC44LCBjb2wgPSAicmVkIikNCnRleHQoeCA9IHBsb3QuYWdlLCB5ID0gYWdlLm5hdGlvbiRgTWVhbiBvZiBhZ2VgICxsYWJlbCA9IGFnZS5uYXRpb24kTmF0aW9uLHNydD05MCwgcG9zID0gMiwgY2V4ID0gMSwgY29sID0gImJsYWNrIixhZGo9MikNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCiNBIGNsdWJvayBtZWx5ZWtiZW4gw6F0bGFnb3NhbiBhIGxlZ2ZpYXRhbGFiYiBqw6F0w6lrb3NvayBqw6F0c3phbmFrDQphZ2UuY2x1YjwtYWdncmVnYXRlKEZJRkFEQVRBQkFTRSRhZ2UsIGJ5PWxpc3QoQ2x1YnMgPSBGSUZBREFUQUJBU0UkY2x1Yl9uYW1lKSwgRlVOID0gbWVhbiApDQphZ2UuY2x1YiA8LSBhZ2UuY2x1YltvcmRlcihhZ2UuY2x1YlssMl0sZGVjcmVhc2luZyA9IEZBTFNFICksXQ0KYWdlLmNsdWIgPC0gYWdlLmNsdWJbMToxMCxdDQoNCmNvbG5hbWVzKGFnZS5jbHViKSA8LSBjKCJDbHViIiwgIk1lYW4gb2YgYWdlIikNCg0KYWdlLmNsdWINCnlsaW0gPC0gYygwLCAxLjEqbWF4KGFnZS5jbHViJGBNZWFuIG9mIGFnZWApKQ0KDQpwbG90LmFnZTwtYmFycGxvdChhZ2UuY2x1YiRgTWVhbiBvZiBhZ2VgLG5hbWVzID0gYWdlLmNsdWIkQ2x1Yix3aWR0aCA9IDMseWxpbSA9IHlsaW0seGF4dD0ibiIsDQogICAgICAgIGNvbCA9IE5VTEwsDQogICAgICAgIGhvcml6ID0gRkFMU0UsDQogICAgICAgIGNleC5uYW1lcyA9IDAuNiwNCiAgICAgICAgeWxhYiA9ICJBZ2UgKHllYXIpIiwNCiAgICAgICAgbWFpbj0iQXZlcmFnZSBhZ2UgYnkgY2x1YnMiKQ0Kcm91bmRlZC5hdmVyYWdlLmhlaWdodHM8LXJvdW5kKGFnZS5jbHViJGBNZWFuIG9mIGFnZWAsZGlnaXRzID0gMikNCg0KdGV4dCh4ID0gcGxvdC5hZ2UsIHkgPSBhZ2UuY2x1YiRgTWVhbiBvZiBhZ2VgICxsYWJlbCA9IHJvdW5kZWQuYXZlcmFnZS5oZWlnaHRzLCBwb3MgPSAzLCBjZXggPSAwLjgsIGNvbCA9ICJibHVlIikNCnRleHQoeCA9IHBsb3QuYWdlLCB5ID0gYWdlLmNsdWIkYE1lYW4gb2YgYWdlYCAsbGFiZWwgPSBhZ2UuY2x1YiRDbHViLHNydD05MCwgcG9zID0gMiwgY2V4ID0gMSwgY29sID0gImJsYWNrIixhZGo9MikNCg0KI0EgY2x1Ym9rIG1lbHlla2JlbiDDoXRsYWdvc2FuIGEgbGVnaWTFkXNlYmIgasOhdMOpa29zb2sgasOhdHN6YW5haw0KYWdlLmNsdWI8LWFnZ3JlZ2F0ZShGSUZBREFUQUJBU0UkYWdlLCBieT1saXN0KENsdWJzID0gRklGQURBVEFCQVNFJGNsdWJfbmFtZSksIEZVTiA9IG1lYW4gKQ0KYWdlLmNsdWIgPC0gYWdlLmNsdWJbb3JkZXIoYWdlLmNsdWJbLDJdLGRlY3JlYXNpbmcgPSBUUlVFICksXQ0KYWdlLmNsdWIgPC0gYWdlLmNsdWJbMToxMCxdDQoNCmNvbG5hbWVzKGFnZS5jbHViKSA8LSBjKCJDbHViIiwgIk1lYW4gb2YgYWdlIikNCg0KYWdlLmNsdWINCnlsaW0gPC0gYygwLCAxLjEqbWF4KGFnZS5jbHViJGBNZWFuIG9mIGFnZWApKQ0KDQpwbG90LmFnZTwtYmFycGxvdChhZ2UuY2x1YiRgTWVhbiBvZiBhZ2VgLG5hbWVzID0gYWdlLmNsdWIkQ2x1Yix3aWR0aCA9IDMseWxpbSA9IHlsaW0seGF4dD0ibiIsDQogICAgICAgIGNvbCA9IE5VTEwsDQogICAgICAgIGhvcml6ID0gRkFMU0UsDQogICAgICAgIGNleC5uYW1lcyA9IDAuNiwNCiAgICAgICAgeWxhYiA9ICJBZ2UgKHllYXIpIiwNCiAgICAgICAgbWFpbj0iQXZlcmFnZSBhZ2UgYnkgY2x1YnMiKQ0Kcm91bmRlZC5hdmVyYWdlLmhlaWdodHM8LXJvdW5kKGFnZS5jbHViJGBNZWFuIG9mIGFnZWAsZGlnaXRzID0gMikNCg0KdGV4dCh4ID0gcGxvdC5hZ2UsIHkgPSBhZ2UuY2x1YiRgTWVhbiBvZiBhZ2VgICxsYWJlbCA9IHJvdW5kZWQuYXZlcmFnZS5oZWlnaHRzLCBwb3MgPSAzLCBjZXggPSAwLjgsIGNvbCA9ICJibHVlIikNCnRleHQoeCA9IHBsb3QuYWdlLCB5ID0gYWdlLmNsdWIkYE1lYW4gb2YgYWdlYCAsbGFiZWwgPSBhZ2UuY2x1YiRDbHViLHNydD05MCwgcG9zID0gMiwgY2V4ID0gMSwgY29sID0gImJsYWNrIixhZGo9MC41KQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNhIHRvcCAxMCBsZWd0w7ZiYiBqw6F0w6lrb3N0IGEgRklGQS1iYSBkZWxlZ8OhbMOzIG9yc3rDoWcNCg0KZGlmZmVyZW50X25hdGlvbnMgPC11bmlxdWUoRklGQURBVEFCQVNFJG5hdGlvbmFsaXR5KQ0KDQpwbGF5ZXJzQ291bnRlZCA8LXRhYmxlKEZJRkFEQVRBQkFTRSRuYXRpb25hbGl0eSkNCm51bWJlck9mUGxheWVyc0J5TmF0aW9ucyA8LWRhdGEuZnJhbWUocGxheWVyc0NvdW50ZWQpDQpudW1iZXJPZlBsYXllcnNCeU5hdGlvbnMgPC0gbnVtYmVyT2ZQbGF5ZXJzQnlOYXRpb25zW29yZGVyKG51bWJlck9mUGxheWVyc0J5TmF0aW9uc1ssMl0sZGVjcmVhc2luZyA9IFRSVUUgKSxdDQpudW1iZXJPZlBsYXllcnNCeU5hdGlvbnMgPC0gbnVtYmVyT2ZQbGF5ZXJzQnlOYXRpb25zWzE6MTAsXQ0KDQpjb2xuYW1lcyhudW1iZXJPZlBsYXllcnNCeU5hdGlvbnMpIDwtIGMoIk5hdGlvbiIsICJOdW1iZXIgb2YgcGxheWVycyIpDQoNCm51bWJlck9mUGxheWVyc0J5TmF0aW9ucw0KbmF0aW9uczwtIHVuaXF1ZShudW1iZXJPZlBsYXllcnNCeU5hdGlvbnMkTmF0aW9uKQ0KbnVtYmVyczwtYyhudW1iZXJPZlBsYXllcnNCeU5hdGlvbnMkYE51bWJlciBvZiBwbGF5ZXJzYCkNCg0KbGlicmFyeShwbG90bHkpDQoNCnBpZSA8LSBwbG90X2x5KG51bWJlck9mUGxheWVyc0J5TmF0aW9ucywgbGFiZWxzID0gbmF0aW9ucywgdmFsdWVzID0gbnVtYmVycywgdHlwZSA9ICdwaWUnLHRleHQ9bnVtYmVycykNCnBpZQ0KDQpgYGANCg0KYGBge3J9DQojdG9wIDIwIGxlZ2pvYmIgw6F0bGFnZml6ZXTDqXPFsSBrbHViDQoNCndhZ2UuYXZlcmFnZS5ieS5jbHViczwtIGFnZ3JlZ2F0ZShGSUZBREFUQUJBU0UuZmlsdGVyZWQkd2FnZV9ldXIsIGJ5PWxpc3QoQ2x1YiA9IEZJRkFEQVRBQkFTRS5maWx0ZXJlZCRjbHViX25hbWUpLCBGVU4gPSBtZWFuICkNCndhZ2UuYXZlcmFnZS5ieS5jbHVicyA8LSB3YWdlLmF2ZXJhZ2UuYnkuY2x1YnNbb3JkZXIod2FnZS5hdmVyYWdlLmJ5LmNsdWJzWywyXSxkZWNyZWFzaW5nID0gVFJVRSksXQ0KDQpjb2xuYW1lcyh3YWdlLmF2ZXJhZ2UuYnkuY2x1YnMpIDwtIGMoIkNsdWIiLCAiTWVhbiBvZiB3YWdlIGJ5IGNsdWJzIikNCg0KeWxpbSA8LSBjKDAsIDEuMiptYXgod2FnZS5hdmVyYWdlLmJ5LmNsdWJzJGBNZWFuIG9mIHdhZ2UgYnkgY2x1YnNgKSkNCndhZ2UuYXZlcmFnZS5ieS5jbHVicyA8LSB3YWdlLmF2ZXJhZ2UuYnkuY2x1YnNbMToyMCxdDQoNCnJvdW5kZWQuYXZlcmFnZS53YWdlPC1yb3VuZCh3YWdlLmF2ZXJhZ2UuYnkuY2x1YnMkYE1lYW4gb2Ygd2FnZSBieSBjbHVic2AsZGlnaXRzID0gMCkNCg0KcGxvdC53YWdlPC1iYXJwbG90KHdhZ2UuYXZlcmFnZS5ieS5jbHVicyRgTWVhbiBvZiB3YWdlIGJ5IGNsdWJzYCxuYW1lcyA9IHdhZ2UuYXZlcmFnZS5ieS5jbHVicyRDbHViLHlsaW0gPXlsaW0sbGFzPTIsDQogICAgICAgIGNvbCA9IDE6MzAsDQogICAgICAgIGhvcml6ID0gRkFMU0UsDQogICAgICAgIGNleC5uYW1lcyA9IC42LA0KICAgICAgICBtYWluPSJNZWFuIG9mIHdhZ2UgYnkgQ2x1YnMiKQ0KDQp0ZXh0KHggPSBwbG90LndhZ2UsIHkgPSB3YWdlLmF2ZXJhZ2UuYnkuY2x1YnMkYE1lYW4gb2Ygd2FnZSBieSBjbHVic2AgLGxhYmVsID0gcm91bmRlZC5hdmVyYWdlLndhZ2UsIHBvcyA9IDQsIGNleCA9IDAuNywgDQogICAgIGNvbCA9ICJibGFjayIsc3J0PTQ1KQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K